package cn.amossun.starter.event.annoation;

import cn.amossun.starter.event.EventDefinition;
import org.springframework.amqp.core.AcknowledgeMode;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 事件监听
 */
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface EventListener {

    /**
     * 主题
     * routing key
     *
     * @return
     */
    String key();

    /**
     * 事件范围定义
     *
     * @return 事件范围定义
     */
    EventDefinition.Scope definition() default EventDefinition.Scope.DEFAULT;

    /**
     * 是否重试
     *
     * @return 是否重试
     */
    boolean reTry() default false;

    /**
     * 根据设置的Class自动生成输入json
     *
     * @return 设置的json Class
     */
    // TODO
    Class<?> schemaClass() default Object.class;

    /**
     * 对Rabbit管理员的引用。如果监听器正在使用自动删除队列，并且这些队列已配置为条件声明，则为必需。
     * 这是在容器重新启动时重新声明这些队列的管理员。有关更多信息，请参阅参考文档。
     *
     * 返回：{@link org.springframework.amqp.rabbit.core.RabbitAdmin} bean name.
     *
     * @return
     */
    // TODO
    String admin() default "";

    /**
     * 监听消息容器分组
     *
     * @return 监听消息容器分组bean名称
     */
    String group() default "";

    /**
     * 异常处理类
     *
     * @return 异常处理beanName
     */
    // TODO
    String errorHandler() default "";

    /**
     * Set the concurrency of the listener container for this listener. Overrides the
     * default set by the listener container factory. Maps to the concurrency setting of
     * the container type.
     * <p>For a
     * {@link org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer
     * SimpleMessageListenerContainer} if this value is a simple integer, it sets a fixed
     * number of consumers in the {@code concurrentConsumers} property. If it is a string
     * with the form {@code "m-n"}, the {@code concurrentConsumers} is set to {@code m}
     * and the {@code maxConcurrentConsumers} is set to {@code n}.
     * <p>For a
     * {@link org.springframework.amqp.rabbit.listener.DirectMessageListenerContainer
     * DirectMessageListenerContainer} it sets the {@code consumersPerQueue} property.
     * @return the concurrency.
     * @since 2.0
     */
    String concurrency() default "";

    /**
     * 是否自动启动
     * @return
     */
    boolean autoStartup() default true;

    /**
     * 消息独占标识
     *
     * @return
     */
    boolean exclusive() default false;

    /**
     * 此端点的优先级，默认情况下不会更改容器优先级。数字越大表示优先级越高，正数和负数都可以使用。
     * 需要RabbitMQ 3.2或更高版本。
     *
     * @return
     */
    int priority() default 1;

    /**
     * 消息确认模式：
     * 默认为自动-容器将根据侦听器是否正常返回或抛出异常发出ack/nack；不要与RabbitMQ autoAck混淆，后者在这里用NONE表示。
     *
     * @return
     */
    AcknowledgeMode ackMode() default AcknowledgeMode.AUTO;

    /**
     * 预取消息数量
     * @return
     */
    int prefetchCount() default 1;

    /**
     * 用于在发送响应之前对其进行后期处理; {@link org.springframework.amqp.rabbit.listener.adapter.ReplyPostProcessor}
     * @see org.springframework.amqp.rabbit.listener.adapter.AbstractAdaptableMessageListener#setReplyPostProcessor(org.springframework.amqp.rabbit.listener.adapter.ReplyPostProcessor)
     *
     * @return {@link org.springframework.amqp.rabbit.listener.adapter.ReplyPostProcessor} beanName
     */
    // TODO
    String replyPostProcessor() default "";

    /**
     * 是否开启默认Topic消息交换机
     *
     * @return
     */
    @Deprecated
    boolean defaultTopicExchange() default true;

    /**
     * 是否开启默认头部消息交换机
     *
     * @return
     */
    @Deprecated
    boolean defaultHeadersExchange() default false;

    /**
     * 是否自动删除
     *
     * @return
     */
    boolean autoDelete() default false;

    /**
     * 消息参数
     *
     * @return
     */
    Argument[] arguments() default {};

    /**
     * 关联队列
     *
     * @return
     */
    EventQueue[] queuesToDeclare() default {};

    /**
     * 关联绑定
     *
     * @return
     */
    EventBinding[] bindings() default {};

}
